package controller

import (
	"bytes"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"io"
	"path"
	"struggle/logic"
)

var allowImage = map[string]bool{
	".png":  true,
	".jpg":  true,
	".jpeg": true,
	".gif":  true,
}

type ImageController struct{}

var DefaultImageController = &ImageController{}

// RegisterRoute 管理 ImageController 路由
func (m ImageController) RegisterRoute(r *gin.Engine) {
	// 需要登录后才能访问的放在下面
	r.Use(JWTAuthMiddleware())
	r.POST("/image/upload", m.upload)
}

func (m ImageController) upload(c *gin.Context) {
	// 1. 因为上传文件一定要登录，获取当前登录的用户信息
	userSn, err := getCurrentUserSn(c)
	if err != nil {
		zap.L().Error("用户上传操作时未登录")
		ResponseError(c, CodeNotLogin)
		return
	}

	// 2. 从 form 表单中获取文件内容句柄
	file, head, err := c.Request.FormFile("file")
	if err != nil {
		ResponseError(c, CodeInvalidParams)
		return
	}
	defer file.Close()

	// 3. 确保上传的是图片
	ext := path.Ext(head.Filename)
	fmt.Println(head.Filename)
	fmt.Println(ext)
	if _, ok := allowImage[ext]; !ok {
		ResponseErrorWithMsg(c, CodeServerBusy, "上传图片格式非法")
		return
	}

	// 4. 把文件内容转化为 []byte
	buf := bytes.NewBuffer(nil)
	if _, err := io.Copy(buf, file); err != nil {
		ResponseErrorWithMsg(c, CodeServerBusy, "2. 把文件内容转化为 []byte")
		return
	}

	// 5. 保存图片信息到数据库
	fileMeta, err := logic.DefaultFile.Create(userSn, head.Filename, buf.Bytes())
	if err != nil {
		ResponseErrorWithMsg(c, CodeServerBusy, "3. 保存图片信息到数据库")
		return
	}
	ResponseSuccess(c, map[string]interface{}{
		"uri": viper.GetString("domain") + "/" + fileMeta.Location,
	})
}
